#include "BlockQueue.h"
#include <ctime>
#include "Task.hpp"

std::string symbol = "+-*/%";

//消费者
void *Consumer(void *args)
{
    BlockQueue<Task> *cp = static_cast<BlockQueue<Task>*>(args);

    while(true)
    {
        sleep(1);
        //消费数据
        Task t = cp->pop();
        t();
        // std::cout << rand() % 100 << std::endl;
    }
} 

//生产者
void *Productor(void *args)
{
    BlockQueue<Task> *cp = static_cast<BlockQueue<Task>*>(args);

    // int d pata = 0;
    int a, b;
    int len = symbol.size();
    while(true)
    {
        sleep(1);
        //生产数据
        // data++;
        a = rand() % 10 + 1;
        b = rand() % 10;
        Task t(a, b, symbol[rand() % len]);
        cp->push(t);
        t.GetTask();
        // sleep(1);

    }
}

int main()
{
    //种下一颗随机数种子
    srand((unsigned)time(nullptr) ^ getpid());
    pthread_t C, P;
    //还可以跑对象和任务
    BlockQueue<Task> *bq = new BlockQueue<Task>;
    
    pthread_create(&C, nullptr, Consumer, bq);

    pthread_create(&P, nullptr, Productor, bq);

    pthread_join(C, nullptr);

    pthread_join(P, nullptr);
   
    delete bq;

    return 0;
}

// int main()
// {
//     //种下一颗随机数种子
//     srand(time(nullptr));
//     pthread_t C[3], P[5];
//     //还可以跑对象和任务
//     BlockQueue<Task> *bq = new BlockQueue<Task>;
//     for(int i = 0; i < 3; i++)
//     {
//         pthread_create(C, nullptr, Consumer, bq);
//     }

//     for(int i = 0; i < 5; i++)
//     {
//         pthread_create(P, nullptr, Productor, bq);
//     }

//     for(int i = 0; i < 3; i++)
//     {
//         pthread_join(C[i], nullptr);
//     }

//     for(int i = 0; i < 5; i++)
//     {
//         pthread_join(P[i], nullptr);
//     }
   
//     delete bq;

//     return 0;
// }